home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / FPT1_RTI.ZIP / fpt1_rti.txt
Text File  |  1995-02-12  |  40KB  |  675 lines

  1.   ┌──────────────────────[ Rage Technologies, Inc. ]─────────────────────────┐
  2.   │                                                                          │
  3.   │                             - Members -                                  │
  4.   │                       ] Myth: Ideas / Coder [                            │
  5.   │                      ] Night Stalker: Coder [                            │
  6.   │                       ] SKoRPiON: Musician [                             │
  7.   │                                                                          │
  8.   │                          - Support Board -                               │
  9.   │          ] Shadow Lands: (407) 851-2313, run by Night Stalker [          │
  10.   │                                                                          │
  11. ──┴──────────────────────────────────────────────────────────────────────────┴──
  12.       How to use Fixed Point (16.16) Math (Part 1 of 2) - by Night Stalker
  13. ────────────────────────────────────────────────────────────────────────────────
  14.  
  15.     Allright, a simple question: what exactly *IS* fixed point math?
  16.  
  17.     Fixed point math is a very simple way to speed up any program that uses
  18. floating point.  The 16.16 describes how many bits are before and after the
  19. decimal point.  (In this case, 65535.65535 is the largest possible number.)
  20. There are other variants such as 24.8, and 8.24.  It depends on what your
  21. application needs in regards to precision.
  22.  
  23.     Even with a math coprocessor (as it is becoming a standard nowadays),
  24. floating point speeds are slow.  I will go into much detail about how fixed
  25. point can be used in your programs, as well as some trigonometric functions.
  26.  
  27.     But first, I must give credit to where credit is due.  The code I am
  28. referencing was created by David Boeren.  If you wish to reach him, E-mail
  29. me, and I will give you his address.  (I'd rather not post it publicly,
  30. although I don't think he'd mind...)
  31.  
  32. ────────────────────────────────────────────────────────────────────────────────
  33.  
  34.     First, we'll start out on how we actually set our program up to handle
  35. fixed point.  You really only need one definition to use fixed point math:
  36.  
  37. typedef long Fixed32;          // 16.16 FixedPoint
  38.  
  39.     Then whenever you want a fixed point number, just use 'Fixed32' instead
  40. of 'float'.
  41.  
  42. ────────────────────────────────────────────────────────────────────────────────
  43.  
  44.     Allright, you've got fixed point now.  How do you actually get a number
  45. into this format?
  46.  
  47.     This is a little trickier.  If you're using an integer or a char, you
  48. simply shift left over the decimal point.  Longs are truncated because only
  49. 2 bytes fit in the upper portion of a Fixed32.
  50.  
  51.     The following #defines will help you out from converting to and from
  52. any format to Fixed32 and back:
  53.  
  54. #define INT_TO_FIXED(x)         ((x) << 16)
  55. #define DOUBLE_TO_FIXED(x)      ((long)(x * 65536.0 + 0.5))
  56. #define FIXED_TO_INT(x)         ((x) >> 16)
  57. #define FIXED_TO_DOUBLE(x)      (((double)x) / 65536.0)
  58. #define ROUND_FIXED_TO_INT(x)   (((x) + 0x8000) >> 16)
  59.  
  60.     I also use the following #defines as well to access some well-known
  61. numbers:
  62.  
  63. #define ONE             INT_TO_FIXED(1)
  64. #define FIXED_PI        205887L
  65. #define FIXED_2PI       411775L
  66. #define FIXED_E         178144L
  67. #define FIXED_ROOT2      74804L
  68. #define FIXED_ROOT3     113512L
  69. #define FIXED_GOLDEN    106039L
  70.  
  71.     Notice that FIXED_2PI is not equal to 2 * PI.  Why?  Well, 2 * FIXED_PI
  72. is technically close enough, but FIXED_2PI is closer.  :)
  73.  
  74. ────────────────────────────────────────────────────────────────────────────────
  75.  
  76.     Okay, you understand fixed point and now you want to do the basics of math.
  77. How do we accomplish adding, subtracting, multipling, and dividing?
  78.  
  79.     Adding and subtracting are simple.  You simply add and subtract like you
  80. would normal floats.  (ie: c = a + b;  d -= c;  etc, etc.)
  81.  
  82.     Multiplication and division require a little more.  Since the code was
  83. done assuming you're using the 32-bit registers, you'll run into some
  84. problems if you try to port this to a 16-bit compiler.  To be honest, I don't
  85. even think it's possible.  Anyways, here's the code to multiply and divide
  86. fixed point numbers:
  87.  
  88. Fixed32 FixedMul(Fixed32 num1, Fixed32 num2);
  89. Fixed32 FixedDiv(Fixed32 numer, Fixed32 denom);
  90.  
  91. #pragma aux FixedMul =      \
  92.     "imul edx"              \
  93.     "add eax, 8000h"        \
  94.     "adc edx, 0"            \
  95.     "shrd eax, edx, 16"     \
  96.     parm caller [eax] [edx] \
  97.     value [eax]             \
  98.     modify [eax edx];
  99.  
  100. #pragma aux FixedDiv =      \
  101.     "xor eax, eax"          \
  102.     "shrd eax, edx, 16"     \
  103.     "sar edx, 16"           \
  104.     "idiv ebx"              \
  105.     parm caller [edx] [ebx] \
  106.     value [eax]             \
  107.     modify [eax ebx edx];
  108.  
  109.     If you're up on your assembly code, you'll notice that FixedDiv() doesn't
  110. do any rounding.  Just take that into note.
  111.  
  112.     If some of you have never done assembly in Watcom, I'll try to help.
  113. Watcom's way of adding assembly into your programs starts with a #pragma.
  114. The standard format is:
  115.  
  116. #pragma aux <Function name> =       \
  117.     "<asm code>"                    \
  118.     "<more asm code>"               \
  119.     "<...>"                         \
  120.     parm caller [<register>] ...    \
  121.     value [<register>]              \
  122.     modify [<register> ...];
  123.  
  124.     Watcom uses 'parm caller' to know where to put the variables that are
  125. passed to an inline assembly function.  For example in FixedDiv(), the
  126. numerator is passed into the EDX register, and the denominator is passed
  127. into the EBX register.  The 'value' command is used to determine what
  128. register contains the value to return to the program when the inline code
  129. has completed.  The 'modify' command tells Watcom what registers to push
  130. onto the stack (since you will be modifying them).  Watcom allows omitting
  131. of 'parm caller' and 'value' if there is no need for them.  If you have
  132. a function which doesn't return a value, then omit 'value'.  The same goes
  133. for 'parm caller'.
  134.  
  135.     Unfortunately, I've only had success at putting inline code into my .H
  136. (or .HPP) files.  If anyone knows the answer to this mystery, *PLEASE* tell
  137. me.  Thanks.  :)
  138.  
  139. ────────────────────────────────────────────────────────────────────────────────
  140.  
  141.     Moving right along... now that you know the basic math, we can start on
  142. how to do some of the harder math functions:  squaring, one over (1/x),
  143. square root, and logarithm.
  144.  
  145. Fixed32 FixedSquare(Fixed32 n);
  146. Fixed32 OneOver(Fixed32 n);
  147. Fixed32 FixedSqrtLP(Fixed32 n);  // Low  Precision (8.8)
  148. Fixed32 FixedSqrtHP(Fixed32 n);  // High Precision (8.16)
  149. Fixed32 FixedLog(Fixed32 num, Fixed32 base);
  150.  
  151. // This is faster than using FixedMul for squares.
  152. #pragma aux FixedSquare =   \
  153.     "imul eax"              \
  154.     "add eax, 8000h"        \
  155.     "adc edx, 0"            \
  156.     "shrd eax, edx, 16"     \
  157.     parm caller [eax]       \
  158.     value [eax]             \
  159.     modify [eax edx];
  160.  
  161. // This is faster than using FixedDiv.
  162. #pragma aux OneOver =       \
  163.     "xor eax, eax"          \
  164.     "mov edx, 1"            \
  165.     "idiv ebx"              \
  166.     parm caller [ebx]       \
  167.     value [eax]             \
  168.     modify [eax ebx edx];
  169.  
  170. #pragma aux FixedSqrtLP =            \
  171.     "         xor eax, eax"          \
  172.     "         mov ebx, 40000000h"    \
  173.     "sqrtLP1: mov edx, ecx"          \
  174.     "         sub edx, ebx"          \
  175.     "         jl  sqrtLP2"           \
  176.     "         sub edx, eax"          \
  177.     "         jl  sqrtLP2"           \
  178.     "         mov ecx,edx"           \
  179.     "         shr eax, 1"            \
  180.     "         or  eax, ebx"          \
  181.     "         shr ebx, 2"            \
  182.     "         jnz sqrtLP1"           \
  183.     "         shl eax, 8"            \
  184.     "         jmp sqrtLP3"           \
  185.     "sqrtLP2: shr eax, 1"            \
  186.     "         shr ebx, 2"            \
  187.     "         jnz sqrtLP1"           \
  188.     "         shl eax, 8"            \
  189.     "sqrtLP3: nop"                   \
  190.     parm caller [ecx]                \
  191.     value [eax]                      \
  192.     modify [eax ebx ecx edx];
  193.  
  194. #pragma aux FixedSqrtHP =            \
  195.     "         xor eax, eax"          \
  196.     "         mov ebx, 40000000h"    \
  197.     "sqrtHP1: mov edx, ecx"          \
  198.     "         sub edx, ebx"          \
  199.     "         jb  sqrtHP2"           \
  200.     "         sub edx, eax"          \
  201.     "         jb  sqrtHP2"           \
  202.     "         mov ecx,edx"           \
  203.     "         shr eax, 1"            \
  204.     "         or  eax, ebx"          \
  205.     "         shr ebx, 2"            \
  206.     "         jnz sqrtHP1"           \
  207.     "         jz  sqrtHP5"           \
  208.     "sqrtHP2: shr eax, 1"            \
  209.     "         shr ebx, 2"            \
  210.     "         jnz sqrtHP1"           \
  211.     "sqrtHP5: mov ebx, 00004000h"    \
  212.     "         shl eax, 16"           \
  213.     "         shl ecx, 16"           \
  214.     "sqrtHP3: mov edx, ecx"          \
  215.     "         sub edx, ebx"          \
  216.     "         jb  sqrtHP4"           \
  217.     "         sub edx, eax"          \
  218.     "         jb  sqrtHP4"           \
  219.     "         mov ecx, edx"          \
  220.     "         shr eax, 1"            \
  221.     "         or  eax, ebx"          \
  222.     "         shr ebx, 2"            \
  223.     "         jnz sqrtHP3"           \
  224.     "         jmp sqrtHP6"           \
  225.     "sqrtHP4: shr eax, 1"            \
  226.     "         shr ebx, 2"            \
  227.     "         jnz sqrtHP3"           \
  228.     "sqrtHP6: nop"                   \
  229.     parm caller [ecx]                \
  230.     value [eax]                      \
  231.     modify [eax ebx ecx edx];
  232.  
  233. Fixed32 FixedLog(Fixed32 num, Fixed32 base)
  234. {
  235.     return FixedDiv(FixedLn(num), FixedLn(base));
  236. }
  237.  
  238.     I hope you don't gawk at all that assembly code.  Not to worry, there isn't
  239. any more.  :)  Note that the high precision square root takes more time to
  240. perform than it does for the lower precision.
  241.  
  242.     One note here regarding the inline assembly.  As you can see, jumps are
  243. possible in the code.  However, when you have a jump to the last command
  244. (see 'sqrtHP6:' above..), you need an instruction or Watcom will yell at you.
  245. Pick your own, I found NOP to be the best since it suited my needs just fine.
  246.  
  247. ────────────────────────────────────────────────────────────────────────────────
  248.  
  249.     Allright, this is the last section:  How to do trigonometric functions
  250. in fixed point.
  251.  
  252.     Well, I found it easier to use lookup tables since the need for fixed
  253. point in the first place was for speed.  Why bother bogging down the processor
  254. with floating point cosines and sines and converting them to fixed point?
  255.  
  256. #define MAX_TRIG 1024
  257.  
  258. void CosSin(Iangle theta, Fixed32 *Cos, Fixed32 *Sin)
  259. {
  260.     theta &= (MAX_TRIG - 1);
  261.  
  262.     *Sin = SinTab[theta];
  263.     *Cos = CosTab[theta];
  264. }
  265.  
  266. Fixed32 Tan(Iangle theta)
  267. {
  268.     // This shifting stuff is for better accuracy.
  269.     theta &= (MAX_TRIG - 1);
  270.     return (FixedDiv(SinTab[theta] << 16, CosTab[theta]) >> 16);
  271. }
  272.  
  273.     The lookup tables are below.  They're separated by bars for ease of
  274. reading.
  275.  
  276. ────────────────────────────────────────────────────────────────────────────────
  277.  
  278. Fixed32 SinTab[MAX_TRIG] = {
  279.              0,        402,        804,       1206,       1608,       2010, 
  280.           2412,       2814,       3216,       3617,       4019,       4420, 
  281.           4821,       5222,       5623,       6023,       6424,       6824, 
  282.           7224,       7623,       8022,       8421,       8820,       9218, 
  283.           9616,      10014,      10411,      10808,      11204,      11600, 
  284.          11996,      12391,      12785,      13180,      13573,      13966, 
  285.          14359,      14751,      15143,      15534,      15924,      16314, 
  286.          16703,      17091,      17479,      17867,      18253,      18639, 
  287.          19024,      19409,      19792,      20175,      20557,      20939, 
  288.          21320,      21699,      22078,      22457,      22834,      23210, 
  289.          23586,      23961,      24335,      24708,      25080,      25451, 
  290.          25821,      26190,      26558,      26925,      27291,      27656, 
  291.          28020,      28383,      28745,      29106,      29466,      29824, 
  292.          30182,      30538,      30893,      31248,      31600,      31952, 
  293.          32303,      32652,      33000,      33347,      33692,      34037, 
  294.          34380,      34721,      35062,      35401,      35738,      36075, 
  295.          36410,      36744,      37076,      37407,      37736,      38064, 
  296.          38391,      38716,      39040,      39362,      39683,      40002, 
  297.          40320,      40636,      40951,      41264,      41576,      41886, 
  298.          42194,      42501,      42806,      43110,      43412,      43713, 
  299.          44011,      44308,      44604,      44898,      45190,      45480, 
  300.          45769,      46056,      46341,      46624,      46906,      47186, 
  301.          47464,      47741,      48015,      48288,      48559,      48828, 
  302.          49095,      49361,      49624,      49886,      50146,      50404, 
  303.          50660,      50914,      51166,      51417,      51665,      51911, 
  304.          52156,      52398,      52639,      52878,      53114,      53349, 
  305.          53581,      53812,      54040,      54267,      54491,      54714, 
  306.          54934,      55152,      55368,      55582,      55794,      56004, 
  307.          56212,      56418,      56621,      56823,      57022,      57219, 
  308.          57414,      57607,      57798,      57986,      58172,      58356, 
  309.          58538,      58718,      58896,      59071,      59244,      59415, 
  310.          59583,      59750,      59914,      60075,      60235,      60392, 
  311.          60547,      60700,      60851,      60999,      61145,      61288, 
  312.          61429,      61568,      61705,      61839,      61971,      62101, 
  313.          62228,      62353,      62476,      62596,      62714,      62830, 
  314.          62943,      63054,      63162,      63268,      63372,      63473, 
  315.          63572,      63668,      63763,      63854,      63944,      64031, 
  316.          64115,      64197,      64277,      64354,      64429,      64501, 
  317.          64571,      64639,      64704,      64766,      64827,      64884, 
  318.          64940,      64993,      65043,      65091,      65137,      65180, 
  319.          65220,      65259,      65294,      65328,      65358,      65387, 
  320.          65413,      65436,      65457,      65476,      65492,      65505, 
  321.          65516,      65525,      65531,      65535,      65536,      65535, 
  322.          65531,      65525,      65516,      65505,      65492,      65476, 
  323.          65457,      65436,      65413,      65387,      65358,      65328, 
  324.          65294,      65259,      65220,      65180,      65137,      65091, 
  325.          65043,      64993,      64940,      64884,      64827,      64766, 
  326.          64704,      64639,      64571,      64501,      64429,      64354, 
  327.          64277,      64197,      64115,      64031,      63944,      63854, 
  328.          63763,      63668,      63572,      63473,      63372,      63268, 
  329.          63162,      63054,      62943,      62830,      62714,      62596, 
  330.          62476,      62353,      62228,      62101,      61971,      61839, 
  331.          61705,      61568,      61429,      61288,      61145,      60999, 
  332.          60851,      60700,      60547,      60392,      60235,      60075, 
  333.          59914,      59750,      59583,      59415,      59244,      59071, 
  334.          58896,      58718,      58538,      58356,      58172,      57986, 
  335.          57798,      57607,      57414,      57219,      57022,      56823, 
  336.          56621,      56418,      56212,      56004,      55794,      55582, 
  337.          55368,      55152,      54934,      54714,      54491,      54267, 
  338.          54040,      53812,      53581,      53349,      53114,      52878, 
  339.          52639,      52398,      52156,      51911,      51665,      51417, 
  340.          51166,      50914,      50660,      50404,      50146,      49886, 
  341.          49624,      49361,      49095,      48828,      48559,      48288, 
  342.          48015,      47741,      47464,      47186,      46906,      46624, 
  343.          46341,      46056,      45769,      45480,      45190,      44898, 
  344.          44604,      44308,      44011,      43713,      43412,      43110, 
  345.          42806,      42501,      42194,      41886,      41576,      41264, 
  346.          40951,      40636,      40320,      40002,      39683,      39362, 
  347.          39040,      38716,      38391,      38064,      37736,      37407, 
  348.          37076,      36744,      36410,      36075,      35738,      35401, 
  349.          35062,      34721,      34380,      34037,      33692,      33347, 
  350.          33000,      32652,      32303,      31952,      31600,      31248, 
  351.          30893,      30538,      30182,      29824,      29466,      29106, 
  352.          28745,      28383,      28020,      27656,      27291,      26925, 
  353.          26558,      26190,      25821,      25451,      25080,      24708, 
  354.          24335,      23961,      23586,      23210,      22834,      22457, 
  355.          22078,      21699,      21320,      20939,      20557,      20175, 
  356.          19792,      19409,      19024,      18639,      18253,      17867, 
  357.          17479,      17091,      16703,      16314,      15924,      15534, 
  358.          15143,      14751,      14359,      13966,      13573,      13180, 
  359.          12785,      12391,      11996,      11600,      11204,      10808, 
  360.          10411,      10014,       9616,       9218,       8820,       8421, 
  361.           8022,       7623,       7224,       6824,       6424,       6023, 
  362.           5623,       5222,       4821,       4420,       4019,       3617, 
  363.           3216,       2814,       2412,       2010,       1608,       1206, 
  364.            804,        402,          0, 4294966895, 4294966493, 4294966091, 
  365.     4294965689, 4294965287, 4294964885, 4294964483, 4294964081, 4294963680, 
  366.     4294963278, 4294962877, 4294962476, 4294962075, 4294961674, 4294961274, 
  367.     4294960873, 4294960473, 4294960073, 4294959674, 4294959275, 4294958876, 
  368.     4294958477, 4294958079, 4294957681, 4294957283, 4294956886, 4294956489, 
  369.     4294956093, 4294955697, 4294955301, 4294954906, 4294954512, 4294954117, 
  370.     4294953724, 4294953331, 4294952938, 4294952546, 4294952154, 4294951763, 
  371.     4294951373, 4294950983, 4294950594, 4294950206, 4294949818, 4294949430, 
  372.     4294949044, 4294948658, 4294948273, 4294947888, 4294947505, 4294947122, 
  373.     4294946740, 4294946358, 4294945977, 4294945598, 4294945219, 4294944840, 
  374.     4294944463, 4294944087, 4294943711, 4294943336, 4294942962, 4294942589, 
  375.     4294942217, 4294941846, 4294941476, 4294941107, 4294940739, 4294940372, 
  376.     4294940006, 4294939641, 4294939277, 4294938914, 4294938552, 4294938191, 
  377.     4294937831, 4294937473, 4294937115, 4294936759, 4294936404, 4294936049, 
  378.     4294935697, 4294935345, 4294934994, 4294934645, 4294934297, 4294933950, 
  379.     4294933605, 4294933260, 4294932917, 4294932576, 4294932235, 4294931896, 
  380.     4294931559, 4294931222, 4294930887, 4294930553, 4294930221, 4294929890, 
  381.     4294929561, 4294929233, 4294928906, 4294928581, 4294928257, 4294927935, 
  382.     4294927614, 4294927295, 4294926977, 4294926661, 4294926346, 4294926033, 
  383.     4294925721, 4294925411, 4294925103, 4294924796, 4294924491, 4294924187, 
  384.     4294923885, 4294923584, 4294923286, 4294922989, 4294922693, 4294922399, 
  385.     4294922107, 4294921817, 4294921528, 4294921241, 4294920956, 4294920673, 
  386.     4294920391, 4294920111, 4294919833, 4294919556, 4294919282, 4294919009, 
  387.     4294918738, 4294918469, 4294918202, 4294917936, 4294917673, 4294917411, 
  388.     4294917151, 4294916893, 4294916637, 4294916383, 4294916131, 4294915880, 
  389.     4294915632, 4294915386, 4294915141, 4294914899, 4294914658, 4294914419, 
  390.     4294914183, 4294913948, 4294913716, 4294913485, 4294913257, 4294913030, 
  391.     4294912806, 4294912583, 4294912363, 4294912145, 4294911929, 4294911715, 
  392.     4294911503, 4294911293, 4294911085, 4294910879, 4294910676, 4294910474, 
  393.     4294910275, 4294910078, 4294909883, 4294909690, 4294909499, 4294909311, 
  394.     4294909125, 4294908941, 4294908759, 4294908579, 4294908401, 4294908226, 
  395.     4294908053, 4294907882, 4294907714, 4294907547, 4294907383, 4294907222, 
  396.     4294907062, 4294906905, 4294906750, 4294906597, 4294906446, 4294906298, 
  397.     4294906152, 4294906009, 4294905868, 4294905729, 4294905592, 4294905458, 
  398.     4294905326, 4294905196, 4294905069, 4294904944, 4294904821, 4294904701, 
  399.     4294904583, 4294904467, 4294904354, 4294904243, 4294904135, 4294904029, 
  400.     4294903925, 4294903824, 4294903725, 4294903629, 4294903534, 4294903443, 
  401.     4294903353, 4294903266, 4294903182, 4294903100, 4294903020, 4294902943, 
  402.     4294902868, 4294902796, 4294902726, 4294902658, 4294902593, 4294902531, 
  403.     4294902470, 4294902413, 4294902357, 4294902304, 4294902254, 4294902206, 
  404.     4294902160, 4294902117, 4294902077, 4294902038, 4294902003, 4294901969, 
  405.     4294901939, 4294901910, 4294901884, 4294901861, 4294901840, 4294901821, 
  406.     4294901805, 4294901792, 4294901781, 4294901772, 4294901766, 4294901762, 
  407.     4294901761, 4294901762, 4294901766, 4294901772, 4294901781, 4294901792, 
  408.     4294901805, 4294901821, 4294901840, 4294901861, 4294901884, 4294901910, 
  409.     4294901939, 4294901969, 4294902003, 4294902038, 4294902077, 4294902117, 
  410.     4294902160, 4294902206, 4294902254, 4294902304, 4294902357, 4294902413, 
  411.     4294902470, 4294902531, 4294902593, 4294902658, 4294902726, 4294902796, 
  412.     4294902868, 4294902943, 4294903020, 4294903100, 4294903182, 4294903266, 
  413.     4294903353, 4294903443, 4294903534, 4294903629, 4294903725, 4294903824, 
  414.     4294903925, 4294904029, 4294904135, 4294904243, 4294904354, 4294904467, 
  415.     4294904583, 4294904701, 4294904821, 4294904944, 4294905069, 4294905196, 
  416.     4294905326, 4294905458, 4294905592, 4294905729, 4294905868, 4294906009, 
  417.     4294906152, 4294906298, 4294906446, 4294906597, 4294906750, 4294906905, 
  418.     4294907062, 4294907222, 4294907383, 4294907547, 4294907714, 4294907882, 
  419.     4294908053, 4294908226, 4294908401, 4294908579, 4294908759, 4294908941, 
  420.     4294909125, 4294909311, 4294909499, 4294909690, 4294909883, 4294910078, 
  421.     4294910275, 4294910474, 4294910676, 4294910879, 4294911085, 4294911293, 
  422.     4294911503, 4294911715, 4294911929, 4294912145, 4294912363, 4294912583, 
  423.     4294912806, 4294913030, 4294913257, 4294913485, 4294913716, 4294913948, 
  424.     4294914183, 4294914419, 4294914658, 4294914899, 4294915141, 4294915386, 
  425.     4294915632, 4294915880, 4294916131, 4294916383, 4294916637, 4294916893, 
  426.     4294917151, 4294917411, 4294917673, 4294917936, 4294918202, 4294918469, 
  427.     4294918738, 4294919009, 4294919282, 4294919556, 4294919833, 4294920111, 
  428.     4294920391, 4294920673, 4294920956, 4294921241, 4294921528, 4294921817, 
  429.     4294922107, 4294922399, 4294922693, 4294922989, 4294923286, 4294923584, 
  430.     4294923885, 4294924187, 4294924491, 4294924796, 4294925103, 4294925411, 
  431.     4294925721, 4294926033, 4294926346, 4294926661, 4294926977, 4294927295, 
  432.     4294927614, 4294927935, 4294928257, 4294928581, 4294928906, 4294929233, 
  433.     4294929561, 4294929890, 4294930221, 4294930553, 4294930887, 4294931222, 
  434.     4294931559, 4294931896, 4294932235, 4294932576, 4294932917, 4294933260, 
  435.     4294933605, 4294933950, 4294934297, 4294934645, 4294934994, 4294935345, 
  436.     4294935697, 4294936049, 4294936404, 4294936759, 4294937115, 4294937473, 
  437.     4294937831, 4294938191, 4294938552, 4294938914, 4294939277, 4294939641, 
  438.     4294940006, 4294940372, 4294940739, 4294941107, 4294941476, 4294941846, 
  439.     4294942217, 4294942589, 4294942962, 4294943336, 4294943711, 4294944087, 
  440.     4294944463, 4294944840, 4294945219, 4294945598, 4294945977, 4294946358, 
  441.     4294946740, 4294947122, 4294947505, 4294947888, 4294948273, 4294948658, 
  442.     4294949044, 4294949430, 4294949818, 4294950206, 4294950594, 4294950983, 
  443.     4294951373, 4294951763, 4294952154, 4294952546, 4294952938, 4294953331, 
  444.     4294953724, 4294954117, 4294954512, 4294954906, 4294955301, 4294955697, 
  445.     4294956093, 4294956489, 4294956886, 4294957283, 4294957681, 4294958079, 
  446.     4294958477, 4294958876, 4294959275, 4294959674, 4294960073, 4294960473, 
  447.     4294960873, 4294961274, 4294961674, 4294962075, 4294962476, 4294962877, 
  448.     4294963278, 4294963680, 4294964081, 4294964483, 4294964885, 4294965287, 
  449.     4294965689, 4294966091, 4294966493, 4294966895 };
  450.  
  451. ────────────────────────────────────────────────────────────────────────────────
  452.  
  453. Fixed32 CosTab[MAX_TRIG] = {
  454.          65536,      65535,      65531,      65525,      65516,      65505, 
  455.          65492,      65476,      65457,      65436,      65413,      65387, 
  456.          65358,      65328,      65294,      65259,      65220,      65180, 
  457.          65137,      65091,      65043,      64993,      64940,      64884, 
  458.          64827,      64766,      64704,      64639,      64571,      64501, 
  459.          64429,      64354,      64277,      64197,      64115,      64031, 
  460.          63944,      63854,      63763,      63668,      63572,      63473, 
  461.          63372,      63268,      63162,      63054,      62943,      62830, 
  462.          62714,      62596,      62476,      62353,      62228,      62101, 
  463.          61971,      61839,      61705,      61568,      61429,      61288, 
  464.          61145,      60999,      60851,      60700,      60547,      60392, 
  465.          60235,      60075,      59914,      59750,      59583,      59415, 
  466.          59244,      59071,      58896,      58718,      58538,      58356, 
  467.          58172,      57986,      57798,      57607,      57414,      57219, 
  468.          57022,      56823,      56621,      56418,      56212,      56004, 
  469.          55794,      55582,      55368,      55152,      54934,      54714, 
  470.          54491,      54267,      54040,      53812,      53581,      53349, 
  471.          53114,      52878,      52639,      52398,      52156,      51911, 
  472.          51665,      51417,      51166,      50914,      50660,      50404, 
  473.          50146,      49886,      49624,      49361,      49095,      48828, 
  474.          48559,      48288,      48015,      47741,      47464,      47186, 
  475.          46906,      46624,      46341,      46056,      45769,      45480, 
  476.          45190,      44898,      44604,      44308,      44011,      43713, 
  477.          43412,      43110,      42806,      42501,      42194,      41886, 
  478.          41576,      41264,      40951,      40636,      40320,      40002, 
  479.          39683,      39362,      39040,      38716,      38391,      38064, 
  480.          37736,      37407,      37076,      36744,      36410,      36075, 
  481.          35738,      35401,      35062,      34721,      34380,      34037, 
  482.          33692,      33347,      33000,      32652,      32303,      31952, 
  483.          31600,      31248,      30893,      30538,      30182,      29824, 
  484.          29466,      29106,      28745,      28383,      28020,      27656, 
  485.          27291,      26925,      26558,      26190,      25821,      25451, 
  486.          25080,      24708,      24335,      23961,      23586,      23210, 
  487.          22834,      22457,      22078,      21699,      21320,      20939, 
  488.          20557,      20175,      19792,      19409,      19024,      18639, 
  489.          18253,      17867,      17479,      17091,      16703,      16314, 
  490.          15924,      15534,      15143,      14751,      14359,      13966, 
  491.          13573,      13180,      12785,      12391,      11996,      11600, 
  492.          11204,      10808,      10411,      10014,       9616,       9218, 
  493.           8820,       8421,       8022,       7623,       7224,       6824, 
  494.           6424,       6023,       5623,       5222,       4821,       4420, 
  495.           4019,       3617,       3216,       2814,       2412,       2010, 
  496.           1608,       1206,        804,        402,          0, 4294966895, 
  497.     4294966493, 4294966091, 4294965689, 4294965287, 4294964885, 4294964483, 
  498.     4294964081, 4294963680, 4294963278, 4294962877, 4294962476, 4294962075, 
  499.     4294961674, 4294961274, 4294960873, 4294960473, 4294960073, 4294959674, 
  500.     4294959275, 4294958876, 4294958477, 4294958079, 4294957681, 4294957283, 
  501.     4294956886, 4294956489, 4294956093, 4294955697, 4294955301, 4294954906, 
  502.     4294954512, 4294954117, 4294953724, 4294953331, 4294952938, 4294952546, 
  503.     4294952154, 4294951763, 4294951373, 4294950983, 4294950594, 4294950206, 
  504.     4294949818, 4294949430, 4294949044, 4294948658, 4294948273, 4294947888, 
  505.     4294947505, 4294947122, 4294946740, 4294946358, 4294945977, 4294945598, 
  506.     4294945219, 4294944840, 4294944463, 4294944087, 4294943711, 4294943336, 
  507.     4294942962, 4294942589, 4294942217, 4294941846, 4294941476, 4294941107, 
  508.     4294940739, 4294940372, 4294940006, 4294939641, 4294939277, 4294938914, 
  509.     4294938552, 4294938191, 4294937831, 4294937473, 4294937115, 4294936759, 
  510.     4294936404, 4294936049, 4294935697, 4294935345, 4294934994, 4294934645, 
  511.     4294934297, 4294933950, 4294933605, 4294933260, 4294932917, 4294932576, 
  512.     4294932235, 4294931896, 4294931559, 4294931222, 4294930887, 4294930553, 
  513.     4294930221, 4294929890, 4294929561, 4294929233, 4294928906, 4294928581, 
  514.     4294928257, 4294927935, 4294927614, 4294927295, 4294926977, 4294926661, 
  515.     4294926346, 4294926033, 4294925721, 4294925411, 4294925103, 4294924796, 
  516.     4294924491, 4294924187, 4294923885, 4294923584, 4294923286, 4294922989, 
  517.     4294922693, 4294922399, 4294922107, 4294921817, 4294921528, 4294921241, 
  518.     4294920956, 4294920673, 4294920391, 4294920111, 4294919833, 4294919556, 
  519.     4294919282, 4294919009, 4294918738, 4294918469, 4294918202, 4294917936, 
  520.     4294917673, 4294917411, 4294917151, 4294916893, 4294916637, 4294916383, 
  521.     4294916131, 4294915880, 4294915632, 4294915386, 4294915141, 4294914899, 
  522.     4294914658, 4294914419, 4294914183, 4294913948, 4294913716, 4294913485, 
  523.     4294913257, 4294913030, 4294912806, 4294912583, 4294912363, 4294912145, 
  524.     4294911929, 4294911715, 4294911503, 4294911293, 4294911085, 4294910879, 
  525.     4294910676, 4294910474, 4294910275, 4294910078, 4294909883, 4294909690, 
  526.     4294909499, 4294909311, 4294909125, 4294908941, 4294908759, 4294908579, 
  527.     4294908401, 4294908226, 4294908053, 4294907882, 4294907714, 4294907547, 
  528.     4294907383, 4294907222, 4294907062, 4294906905, 4294906750, 4294906597, 
  529.     4294906446, 4294906298, 4294906152, 4294906009, 4294905868, 4294905729, 
  530.     4294905592, 4294905458, 4294905326, 4294905196, 4294905069, 4294904944, 
  531.     4294904821, 4294904701, 4294904583, 4294904467, 4294904354, 4294904243, 
  532.     4294904135, 4294904029, 4294903925, 4294903824, 4294903725, 4294903629, 
  533.     4294903534, 4294903443, 4294903353, 4294903266, 4294903182, 4294903100, 
  534.     4294903020, 4294902943, 4294902868, 4294902796, 4294902726, 4294902658, 
  535.     4294902593, 4294902531, 4294902470, 4294902413, 4294902357, 4294902304, 
  536.     4294902254, 4294902206, 4294902160, 4294902117, 4294902077, 4294902038, 
  537.     4294902003, 4294901969, 4294901939, 4294901910, 4294901884, 4294901861, 
  538.     4294901840, 4294901821, 4294901805, 4294901792, 4294901781, 4294901772, 
  539.     4294901766, 4294901762, 4294901761, 4294901762, 4294901766, 4294901772, 
  540.     4294901781, 4294901792, 4294901805, 4294901821, 4294901840, 4294901861, 
  541.     4294901884, 4294901910, 4294901939, 4294901969, 4294902003, 4294902038, 
  542.     4294902077, 4294902117, 4294902160, 4294902206, 4294902254, 4294902304, 
  543.     4294902357, 4294902413, 4294902470, 4294902531, 4294902593, 4294902658, 
  544.     4294902726, 4294902796, 4294902868, 4294902943, 4294903020, 4294903100, 
  545.     4294903182, 4294903266, 4294903353, 4294903443, 4294903534, 4294903629, 
  546.     4294903725, 4294903824, 4294903925, 4294904029, 4294904135, 4294904243, 
  547.     4294904354, 4294904467, 4294904583, 4294904701, 4294904821, 4294904944, 
  548.     4294905069, 4294905196, 4294905326, 4294905458, 4294905592, 4294905729, 
  549.     4294905868, 4294906009, 4294906152, 4294906298, 4294906446, 4294906597, 
  550.     4294906750, 4294906905, 4294907062, 4294907222, 4294907383, 4294907547, 
  551.     4294907714, 4294907882, 4294908053, 4294908226, 4294908401, 4294908579, 
  552.     4294908759, 4294908941, 4294909125, 4294909311, 4294909499, 4294909690, 
  553.     4294909883, 4294910078, 4294910275, 4294910474, 4294910676, 4294910879, 
  554.     4294911085, 4294911293, 4294911503, 4294911715, 4294911929, 4294912145, 
  555.     4294912363, 4294912583, 4294912806, 4294913030, 4294913257, 4294913485, 
  556.     4294913716, 4294913948, 4294914183, 4294914419, 4294914658, 4294914899, 
  557.     4294915141, 4294915386, 4294915632, 4294915880, 4294916131, 4294916383, 
  558.     4294916637, 4294916893, 4294917151, 4294917411, 4294917673, 4294917936, 
  559.     4294918202, 4294918469, 4294918738, 4294919009, 4294919282, 4294919556, 
  560.     4294919833, 4294920111, 4294920391, 4294920673, 4294920956, 4294921241, 
  561.     4294921528, 4294921817, 4294922107, 4294922399, 4294922693, 4294922989, 
  562.     4294923286, 4294923584, 4294923885, 4294924187, 4294924491, 4294924796, 
  563.     4294925103, 4294925411, 4294925721, 4294926033, 4294926346, 4294926661, 
  564.     4294926977, 4294927295, 4294927614, 4294927935, 4294928257, 4294928581, 
  565.     4294928906, 4294929233, 4294929561, 4294929890, 4294930221, 4294930553, 
  566.     4294930887, 4294931222, 4294931559, 4294931896, 4294932235, 4294932576, 
  567.     4294932917, 4294933260, 4294933605, 4294933950, 4294934297, 4294934645, 
  568.     4294934994, 4294935345, 4294935697, 4294936049, 4294936404, 4294936759, 
  569.     4294937115, 4294937473, 4294937831, 4294938191, 4294938552, 4294938914, 
  570.     4294939277, 4294939641, 4294940006, 4294940372, 4294940739, 4294941107, 
  571.     4294941476, 4294941846, 4294942217, 4294942589, 4294942962, 4294943336, 
  572.     4294943711, 4294944087, 4294944463, 4294944840, 4294945219, 4294945598, 
  573.     4294945977, 4294946358, 4294946740, 4294947122, 4294947505, 4294947888, 
  574.     4294948273, 4294948658, 4294949044, 4294949430, 4294949818, 4294950206, 
  575.     4294950594, 4294950983, 4294951373, 4294951763, 4294952154, 4294952546, 
  576.     4294952938, 4294953331, 4294953724, 4294954117, 4294954512, 4294954906, 
  577.     4294955301, 4294955697, 4294956093, 4294956489, 4294956886, 4294957283, 
  578.     4294957681, 4294958079, 4294958477, 4294958876, 4294959275, 4294959674, 
  579.     4294960073, 4294960473, 4294960873, 4294961274, 4294961674, 4294962075, 
  580.     4294962476, 4294962877, 4294963278, 4294963680, 4294964081, 4294964483, 
  581.     4294964885, 4294965287, 4294965689, 4294966091, 4294966493, 4294966895, 
  582.              0,        402,        804,       1206,       1608,       2010, 
  583.           2412,       2814,       3216,       3617,       4019,       4420, 
  584.           4821,       5222,       5623,       6023,       6424,       6824, 
  585.           7224,       7623,       8022,       8421,       8820,       9218, 
  586.           9616,      10014,      10411,      10808,      11204,      11600, 
  587.          11996,      12391,      12785,      13180,      13573,      13966, 
  588.          14359,      14751,      15143,      15534,      15924,      16314, 
  589.          16703,      17091,      17479,      17867,      18253,      18639, 
  590.          19024,      19409,      19792,      20175,      20557,      20939, 
  591.          21320,      21699,      22078,      22457,      22834,      23210, 
  592.          23586,      23961,      24335,      24708,      25080,      25451, 
  593.          25821,      26190,      26558,      26925,      27291,      27656, 
  594.          28020,      28383,      28745,      29106,      29466,      29824, 
  595.          30182,      30538,      30893,      31248,      31600,      31952, 
  596.          32303,      32652,      33000,      33347,      33692,      34037, 
  597.          34380,      34721,      35062,      35401,      35738,      36075, 
  598.          36410,      36744,      37076,      37407,      37736,      38064, 
  599.          38391,      38716,      39040,      39362,      39683,      40002, 
  600.          40320,      40636,      40951,      41264,      41576,      41886, 
  601.          42194,      42501,      42806,      43110,      43412,      43713, 
  602.          44011,      44308,      44604,      44898,      45190,      45480, 
  603.          45769,      46056,      46341,      46624,      46906,      47186, 
  604.          47464,      47741,      48015,      48288,      48559,      48828, 
  605.          49095,      49361,      49624,      49886,      50146,      50404, 
  606.          50660,      50914,      51166,      51417,      51665,      51911, 
  607.          52156,      52398,      52639,      52878,      53114,      53349, 
  608.          53581,      53812,      54040,      54267,      54491,      54714, 
  609.          54934,      55152,      55368,      55582,      55794,      56004, 
  610.          56212,      56418,      56621,      56823,      57022,      57219, 
  611.          57414,      57607,      57798,      57986,      58172,      58356, 
  612.          58538,      58718,      58896,      59071,      59244,      59415, 
  613.          59583,      59750,      59914,      60075,      60235,      60392, 
  614.          60547,      60700,      60851,      60999,      61145,      61288, 
  615.          61429,      61568,      61705,      61839,      61971,      62101, 
  616.          62228,      62353,      62476,      62596,      62714,      62830, 
  617.          62943,      63054,      63162,      63268,      63372,      63473, 
  618.          63572,      63668,      63763,      63854,      63944,      64031, 
  619.          64115,      64197,      64277,      64354,      64429,      64501, 
  620.          64571,      64639,      64704,      64766,      64827,      64884, 
  621.          64940,      64993,      65043,      65091,      65137,      65180, 
  622.          65220,      65259,      65294,      65328,      65358,      65387, 
  623.          65413,      65436,      65457,      65476,      65492,      65505, 
  624.          65516,      65525,      65531,      65535 };
  625.  
  626. ────────────────────────────────────────────────────────────────────────────────
  627.  
  628.     A couple of you first starting out in this might be wondering why the
  629. tables suddenly jump from zero to 4.2 billion.  The reason is because I used
  630. unsigned numbers to dump this table.  Since the highest bit in the number
  631. signifies the sign bit, when it jumps to a negative number, the number suddenly
  632. increases to 4.2 billion.  (Actually, it's 2^31, if you want to get EXACT.)
  633.  
  634.     As this is the first part of two, the next file will cover doing Vector
  635. and Matrix calculations.  I'll post it as soon as possible.
  636.  
  637.     But for now, enjoy the speed improvements in your program!
  638.  
  639.                                                 - Night Stalker
  640.  
  641. -------------------------------------------------------------------------------
  642.  
  643. Look for other Rage Technologies, Inc. stuff coming soon:
  644.  
  645.         - Our first major demo, "Transvectoring".  The theme is to
  646.           show off our new 3-D engine with lightsourcing and texture
  647.           mapping... REALLY fast.  Also to show what objects beyond
  648.           3D really look like.  For example, a 4D or a 5D cube.  Maybe
  649.           more.  Expected release date:  Mid '95 (?)
  650.  
  651.         - Night Hawk 0.2α BBS.  The first BBS software to show that
  652.           ANSI is dead, and RIP is a thing of the past.  Features
  653.           include: True multitasking, full video and audio routines,
  654.           and more.  Expected release date:  Early/Mid '96.
  655.  
  656. -------------------------------------------------------------------------------
  657.  
  658. Other news:
  659.  
  660.         - Shadow Lands is *NOT* up!  Please don't call for a few weeks!
  661.           Night Stalker is in the process of rebuilding his system and
  662.           adding more disk space.  We are hoping that Night Stalker will
  663.           have Shadow Lands up by Mid-February.
  664.  
  665.         - Rage Technologies, Inc. has a mailing list.  If you'd like to
  666.           get ahold of any one of us, send E-mail to:
  667.  
  668.                                       ragetech@trappen.vsl.ist.ucf.edu
  669.  
  670.         - Rage Technologies, Inc. also has an experimental FTP server
  671.           running.  If you would like to get any Rage products, simply
  672.           anonymous FTP to:  trappen.vsl.ist.ucf.edu.  All Rage files
  673.           are located in /pub/ragetech.
  674.  
  675.